/*
Copyright © 2025 PengWeiFen <pwf0112@163.com>
*/

package cmd

import (
	"fmt"
	"os"

	"gitee.com/wfpeng/fanyi/pkg/ai"
	"gitee.com/wfpeng/fanyi/pkg/config"
	"gitee.com/wfpeng/fanyi/pkg/input"

	"github.com/spf13/cobra"
)

// 配置文件路径
var cfgFile string

// 提示词文件路径
var promptFile string

// 是否显示原文
var withOriginal bool

// 是否禁用流式输出
var noStream bool

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
	Use:   "fanyi",
	Short: "一个简单的命令行文本翻译工具",
	Long: `这是一个在终端中使用的文本翻译工具，可以帮助您快速翻译各种语言的文本内容。
使用简单，效率高，支持多种语言的翻译，是开发者和日常用户的得力助手。`,
	Run: func(cmd *cobra.Command, args []string) {
		// 检查并初始化配置文件
		if err := ensureConfigExists(); err != nil {
			_, _ = fmt.Fprintf(os.Stderr, "初始化配置失败: %v\n", err)
			os.Exit(1)
		}

		cfg, err := config.LoadConfig(cfgFile)
		if err != nil {
			_, _ = fmt.Fprintf(os.Stderr, "加载配置失败: %v\n", err)
			os.Exit(1)
		}

		text, err := input.GetText(args)
		if err != nil {
			_, _ = fmt.Fprintf(os.Stderr, "获取文本内容失败: %v\n", err)
			os.Exit(1)
		}

		// 检查是否有文本需要翻译
		if text == "" {
			_, _ = fmt.Fprintf(os.Stderr, "未提供需要翻译的文本\n")
			os.Exit(1)
		}

		// 创建AI客户端
		client, err := ai.NewClient(cfg, promptFile)
		if err != nil {
			_, _ = fmt.Fprintf(os.Stderr, "创建AI客户端失败: %v\n", err)
			os.Exit(1)
		}

		// 根据用户选择使用流式输出或传统输出
		if noStream {
			// 使用传统的一次性输出模式
			translatedText, err := client.Translate(text, withOriginal)
			if err != nil {
				_, _ = fmt.Fprintf(os.Stderr, "翻译失败: %v\n", err)
				os.Exit(1)
			}
			fmt.Println(translatedText)
		} else {
			// 使用流式输出模式（默认）
			resultChan, errorChan := client.TranslateStream(text, withOriginal)

			// 处理流式输出
			for {
				select {
				case chunk, ok := <-resultChan:
					if !ok {
						// 流式输出完成
						fmt.Println() // 添加换行符
						return
					}
					// 实时输出翻译内容
					fmt.Print(chunk)
				case err := <-errorChan:
					if err != nil {
						_, _ = fmt.Fprintf(os.Stderr, "\n流式翻译失败: %v\n", err)
						os.Exit(1)
					}
				}
			}
		}
	},
}

// Execute 将所有子命令添加到根命令并正确设置标志。
// 此操作由main.main()调用，只需对根命令执行一次即可。
func Execute() {
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

// ensureConfigExists 确保配置文件存在，如果不存在则创建默认配置文件
func ensureConfigExists() error {
	var configPath string
	var err error

	// 如果用户指定了配置文件路径，则检查该文件
	if cfgFile != "" {
		configPath = cfgFile
	} else {
		// 使用默认配置文件路径
		configPath, err = config.GetDefaultConfigPath()
		if err != nil {
			return err
		}
	}

	// 检查配置文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		// 如果用户指定了配置文件路径但文件不存在，返回错误
		if cfgFile != "" {
			return fmt.Errorf("指定的配置文件不存在: %s", cfgFile)
		}
		if err := config.CreateDefaultConfig(configPath); err != nil {
			return fmt.Errorf("创建默认配置文件失败: %w", err)
		}
		return fmt.Errorf("默认配置文件已创建，请编辑 %s 文件并设置您的 API 密钥\n", configPath)
	}

	return nil
}

func init() {
	// 定义持久性标志，适用于所有命令
	rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "配置文件路径 (默认为 $HOME/.fanyi/fanyi.yaml)")
	rootCmd.PersistentFlags().StringVarP(&promptFile, "prompt", "p", "", "提示词文件路径 (默认搜索configs目录、$HOME/.fanyi/和/etc/fanyi/目录下的prompts.txt)")

	// 定义本地标志，仅适用于当前命令
	rootCmd.Flags().BoolVarP(&withOriginal, "with-original", "w", false, "是否在翻译结果中包含原文")
	rootCmd.Flags().BoolVarP(&noStream, "no-stream", "n", false, "禁用流式输出，使用传统的一次性输出模式")
}
